package com.findlocation.persistence.tech.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.findlocation.persistence.tech.dao.GenericDao;
import com.findlocation.persistence.tech.dao.ObjetIdentifiable;

/**
 * Implementation generique du DAO (CRUD: Create, Read, Update, Delete).
 * 
 * @param <T>
 *           Type de l'objet metier du DAO.
 * @param <I>
 *           Identifiant de l'objet metier du DAO.
 */
@SuppressWarnings("unchecked")
public abstract class GenericDaoImpl<T extends ObjetIdentifiable<I>, I extends Serializable> extends CrudDaoImpl<T> implements GenericDao<T, I>
{
   @Override
   public List<T> rechercher() 
   { 
      // Read
      List<T> l_objets = new ArrayList<T>();
      Log l_logger = this.getLogger();
      if( l_logger.isDebugEnabled() )
      {
         l_logger.debug( "Debut du DAO de recherche des objets metier" );
      }
      try
      {
         HibernateTemplate l_hibernateTemplate = this.getHibernateTemplate();
         Class<T> l_entityClass = this.getEntityClass();
         DetachedCriteria l_detachedCriteria = DetachedCriteria.forClass( l_entityClass );
         //l_detachedCriteria.addOrder( Order.asc( "id" ) );
         l_objets = l_hibernateTemplate.findByCriteria( l_detachedCriteria );
      }
      catch( Exception l_erreur )
      {
         l_logger.error( "Erreur du DAO de recherche des objets metier", l_erreur );
   
      }
      if( l_logger.isDebugEnabled() )
      {
         l_logger.debug( "Fin du DAO de recherche des objets metier" );
      }
      return l_objets;
   }
   /**
    * @see GenericDao#trouver(Serializable)
    */
   public T trouver( I anId ) 
   { 
      // Read
      T l_objet = null;
      Log l_logger = this.getLogger();
      if( l_logger.isDebugEnabled() )
      {
         l_logger.debug( "Debut du DAO de recherche de l'objet metier " + anId );
      }
      try
      {
         HibernateTemplate l_hibernateTemplate = this.getHibernateTemplate();
         Class<T> l_entityClass = this.getEntityClass();
         l_objet = (T) l_hibernateTemplate.get( l_entityClass, anId );
      }
      catch( Exception l_erreur )
      {
         l_logger.error( "Erreur du DAO de recherche de l'objet metier " + anId, l_erreur );
      }
      if( l_logger.isDebugEnabled() )
      {
         l_logger.debug( "Fin du DAO de recherche de l'objet metier " + anId );
      }
      return l_objet;
   }
}
